package com.wzx.user.mongo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * @author wzx
 * @version 1.0
 * @date 2022/7/18 - 17:31
 * @description 发送消息
 *
 *     @Id
 *     主键，不可重复，自带索引，可以在定义的列名上标注，需要自己生成并维护不重复的约束。如果自己不设置@Id主键，mongo会自动生成一个唯一主键，并且插入时效率远高于自己设置主键。原因可参考上一篇mongo和mysql的性能对比。
 *     在实际业务中不建议自己设置主键，应交给mongo自己生成，自己可以设置一个业务id，如int型字段，用自己设置的业务id来维护相关联的表。
 *
 *     @Indexed
 *     声明该字段需要加索引，加索引后以该字段为条件检索将大大提高速度。
 *     唯一索引的话是@Indexed(unique = true)。
 *     也可以对数组进行索引，如果被索引的列是数组时，MongoDB会索引这个数组中的每一个元素。
 *     也可以对整个Document进行索引，排序是预定义的按插入BSON数据的先后升序排列。
 *     也可以对关联的对象的字段进行索引，譬如User对关联的address.city进行索引。
 *
 *     @Transient
 *     被该注解标注的，将不会被录入到数据库中。只作为普通的javaBean属性。
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Document(collection = "t_msg")
public class SendMsg {

    @Id
    private long id;

    private Integer tip;

    /**
     * 发送者id
     */
    @Indexed
    private String senderId;

    /**
     * 接收者id
     */
    @Indexed
    private String receiverId;

    /**
     * 聊天内容
     */
    private String message;

    /**
     * 发送者头像
     */
    private String imgUrl;

    /**
     * 消息类型
     */
    private Integer types;

    /**
     * 发送时间
     */
    private String time;

    /**
     * 消息状态
     */
    private String state;

    /**
     * 发送消息人的昵称
     */
    private String name;

    private String groupHead;
    private String groupName;
}
